<?php

declare(strict_types=1);

namespace App\Service\Queue;

use Hyperf\AsyncQueue\Driver\DriverFactory;
use Hyperf\AsyncQueue\Driver\DriverInterface;
use function Hyperf\Config\config;

/**
 * 队列投递服务
 * @author zx
 * @package App\Service\Queue
 */
Class NotifyQueue
{
    protected DriverInterface $driver;

    public function __construct(DriverFactory $driverFactory)
    {
        $this->driver = $driverFactory->get(
            'notify'
        );
    }

    /**
     * 生产消息
     * @param $params
     * @param string $classPath
     * @param int $delay
     * @param bool $isTest
     * @return bool
     */
    public function push($params, string $classPath, int $delay=0, bool $isTest=false):bool
    {
        /** 不是生产环境|灰度环境 缩短执行时间 */
        if (true === $isTest &&
            $delay !== 0 &&
            !in_array(config('app_env'), ['pro','pre'])) {
            $delay = 5;
        }
        // 这里的 `ExampleJob` 会被序列化存到 Redis 中，所以内部变量最好只传入普通数据
        // 同理，如果内部使用了注解 @Value 会把对应对象一起序列化，导致消息体变大。
        // 所以这里也不推荐使用 `make` 方法来创建 `Job` 对象
        return $this->driver->push(new $classPath($params), $delay);
    }

    /**
     * 移除消息
     * @param mixed $data
     * @return bool
     */
    public function delete($params, string $classPath):bool
    {
        return $this->driver->delete(new $classPath($params));
    }
}
